#pragma once
#include <string>
#include "../Headers/types.h"
#include "../Headers/authr.h"
#include "../NS/nameserver.h"

#ifndef MAILBOXSIZE
#define MAILBOXSIZE 10
#endif

#ifndef CONFIG
#define CONFIG ("em-server.cfg")
#endif

#ifndef MAILPATH
#define MAILPATH ("mail/")
#endif

#ifndef MAILSUFFIX
#define MAILSUFFIX (".info")
#endif

namespace TOB {
  class EmailSRV: public AuthRequired {
   public:
    EmailSRV(Nameserver::IP nsip, std::string username, std::string password);
    ~EmailSRV();
    
    /**
     * Получение следующего заголовка
     *
     * @param letterId ID письма (начиная с 0 для каждого пользователя)
     * @param header Содержание заголовка письма
     * @return Результат операции  
     */
    Code::Type getNextSubject(uint32 letterId, std::string &header);
    
    /**
     * Чтение письма
     *
     * @param Содержимое письма
     * @return Результат операции
     */
    Code::Type readLetter(uint32 letterId, std::string &body);
    
    /**
     * Отправка письма
     *
     * @param header Загловок письма
     * @param body Содержимое письма
     * @return Результат операции
     */
    Code::Type sendLetter(std::string header, std::string body);
    
    /**
     * Расширение почтового ящика
     *
     * @return Результат операции
     */
    Code::Type expandMail();
    
   protected:
    bool readUserInfo();
    bool writeUserInfo();

    std::string mailPath, 
      recepient, subject;
    uint32 lastId, mailboxSize,
      defMailboxSize;

   private:
    bool allowed;
    Code::Type result;
  };
}
